package com.hy.video.monitor.rest;

import com.hy.video.monitor.domain.User;
import com.hy.video.monitor.domain.dto.UserProfileDto;
import com.hy.video.monitor.service.UserService;
import com.hy.video.monitor.util.SecurityUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.web.bind.annotation.*;

import java.security.Principal;

/**
 * @program: ca
 * @description
 * @author: 张三少
 * @create: 2022-04-15 13:18
 **/

@Api(tags = "用户资源")
@CrossOrigin
@RequiredArgsConstructor
@RestController
@RequestMapping("/api")
public class UserResource {

//    @GetMapping("/greeting")
//    public String greeting() {
//        return "helle world!";
//    }
//
//    @PostMapping("/greeting")
//    public String makeGreeting(@RequestParam String name, @RequestBody Profile profile) {
//        return "helle world!\n" + name + "!\n" + profile.gender;
//    }
//
//    @PutMapping("/greeting")
//    public String putGreeting(@RequestParam String name) {
//        return "helle world!" + name;
//    }

//    @GetMapping("/principal")
//    public String getPrincipal() {
//        return SecurityContextHolder.getContext().getAuthentication().getName();
//    }

    /**
     * 用户自己的档案
     *
     * @return 用户档案
     */
//    @GetMapping("/me")
//    public String getProfile() {
//        return SecurityUtil.getCurrentLogin();
//    }
//
//
//    @GetMapping("/principal")
//    public String getCurrentPrincipalName(Principal principal) {
//        return principal.getName();// 自动注入 principal 对象
//    }
//
//    @GetMapping("/authentication")
//    public Authentication getPrincipal(Authentication authentication) {
//        return authentication; // 自动注入 authentication 对象
//    }



    @Data
    static class Profile {
        private String gender;
        private String idNo;
    }

    private final UserService userService;

    /**
     * 用户自己的档案
     *
     * @return 用户档案
     */
    @ApiOperation("获取当前登录用户信息")
    @GetMapping("/me")
    public UserProfileDto getProfile() {
        return userService.findOptionalByUsername(SecurityUtil.getCurrentLogin())
            .map(user -> {
                return UserProfileDto
                    .builder()
                    .name(user.getName())
                    .email(user.getEmail())
                    .mobile(user.getMobile())
                    .build();
            })
            .orElseThrow();
    }

    @PostMapping("/me")
    public User saveProfile(@RequestBody UserProfileDto userProfileDto, Principal principal) {
        return userService.findOptionalByUsername(principal.getName())
            .map(user -> userService.saveUser(user
                .withName(userProfileDto.getName())
                .withEmail(userProfileDto.getEmail())
                .withMobile(userProfileDto.getMobile())))
            .orElseThrow();
    }

    @ApiOperation("获取当前登录用户名")
    @GetMapping("/principal")
    public String getCurrentPrincipalName(Principal principal) {
        return principal.getName();
    }

    @GetMapping("/users/{username}")
    public String getCurrentUsername(@PathVariable String username) {
        return username;
    }

    /**
     * @PostAuthorize： 此注解标识在方法执行之后结合securit安全表达式判断鉴权
     * @param email
     * @return returnObject 根据电子邮件查询的用户信息返回值
     */
    @PostAuthorize("authentication.name.equals(returnObject.username)")
    @GetMapping("/users/by-email/{email}")
    public User getUserByEmail(@PathVariable  String email) {
        return userService.findOptionalByEmail(email).orElseThrow();
    }

}
